/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.cip.esymons.colegiatura.bc;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.cip.esymons.colegiatura.be.Cita;
import org.cip.esymons.colegiatura.be.EstadoCita;

/**
 *
 * @author ADMINISTRADOR
 */
@Stateless
public class CitaFacade implements CitaFacadeLocal {
    @PersistenceContext
    private EntityManager em;

    public void create(Cita cita) {
        em.persist(cita);
    }

    public void edit(Cita cita) {
        em.merge(cita);
    }

    public void remove(Cita cita) {
        Cita aux = em.merge(cita);
        em.remove(aux);
    }

    public Cita find(Object id) {
        return em.find(Cita.class, id);
    }

    public List<Cita> findAll() {
        try{
            actualizaCitas();
            return em.createQuery("select object(o) from Cita as o order by o.citFecha, o.cithoraInicio, o.estado.eciNombre").getResultList();
        }catch(Exception ex){
            System.out.println("Error: "+ex.getMessage());
            return new ArrayList<Cita>();
        }
    }

    public Cita buscaCita(Long codigo) {
        try{
            actualizaCitas();
            return (Cita) em.createQuery("select object(o) from Cita as o where o.preCodigo.preCodigo=?1").setParameter(1, codigo).getSingleResult();
        }catch(Exception ex){
            System.out.println("Error: "+ex.getMessage());
            return null;
        }
    }

    public void actualizaCitas(){

           List<Cita> lista = new ArrayList<Cita>();
           EstadoCita estado = new EstadoCita();
           lista = em.createQuery("select object(o) from Cita as o").getResultList();
           int hora1 =  new Date().getHours();

           String time = hora1+":"+new Date().getMinutes();
           System.out.println("time : "+time);
           for(Cita cit: lista){
               int estadoCita = cit.getEstado().getEciCodigo();
               if(cit.getCitFecha().compareTo(new Date())== 0){                   
                  if(time.compareTo(cit.getCithoraInicio())>0){
                     if(estadoCita==1){ //|| estadoCita==4){
                        estado.setEciCodigo(4);
                        cit.setEstado(estado);
                        edit(cit);
                      }
                   }
               }
               if(cit.getCitFecha().compareTo(new Date())< 0){
                  if(estadoCita==1){
                   estado.setEciCodigo(4);
                   cit.setEstado(estado);
                   edit(cit);
                  }
               }               
           }
           lista = null;
    }

    public List<Cita> listaDisponible() {

        try{
            actualizaCitas();
            return em.createQuery("select object(o) from Cita as o where o.estado.eciCodigo=1").getResultList();
        }catch(Exception ex){
            System.out.println("Error: "+ex.getMessage());
            return new ArrayList<Cita>();
        }
    }

    public List<Cita> listaReservadas() {

        try{
            actualizaCitas();
            return em.createQuery("select object(o) from Cita as o where o.estado.eciCodigo=2 order by o.citFecha, o.cithoraInicio").getResultList();
        }catch(Exception ex){
            System.out.println("Error: "+ex.getMessage());
            return new ArrayList<Cita>();
        }
    }

    public Cita buscaCitaXDni(String dni) {
        try{
            actualizaCitas();
            return (Cita)em.createQuery("select c from Cita c join c.preCodigo pre where pre.preCodigo in (select p.preCodigo from Preinscripcion p join p.perCodigo n where n.perNroDNI = ?1)")
                .setParameter(1, dni)
                .getSingleResult();
        }catch(Exception ex){
            System.out.println("Error: "+ex.getMessage());
            return null;
        }
    }

   public Cita buscaCitaFechaYHora(Date fecha, String hora){
     try{
         actualizaCitas();
         return (Cita) em.createQuery("select c from Cita c where c.citFecha=?1 and c.cithoraInicio=?2 order by c.citFecha, c.cithoraInicio, c.estado.eciNombre")
                .setParameter(1, fecha).setParameter(2, hora).getSingleResult();
        }catch(Exception ex){
            System.out.println("Error: "+ex.getMessage());
            return null;
        }

    }

    public List<Cita> buscaCitaXFechaYHora(Date fecha){
        try{
            actualizaCitas();
            return em.createQuery("select c from Cita c where c.citFecha=?1 order by c.citFecha, c.cithoraInicio, c.estado.eciNombre")
                .setParameter(1, fecha).getResultList();
        }catch(Exception ex){
            System.out.println("Error: "+ex.getMessage());
            return new ArrayList<Cita>();
        }

    }
    public List<Cita> listaCitaPorFecha(Date fecha1, Date fecha2){

        try{
            actualizaCitas();
            return em.createQuery("select c from Cita c where c.citFecha between ?1 and ?2 order by c.citFecha, c.estado.eciNombre")
                .setParameter(1, fecha1).setParameter(2, fecha2).getResultList();
        }catch(Exception ex){
            System.out.println("Error: "+ex.getMessage());
            return new ArrayList<Cita>();
        }
    }

}
